/** /////////////////////////////////////////////////////////////////////////////////
 * @author	Jaeger, Mathias
 * @class 	umgebung.js dient dazu Umgebungselemente zu erstellen
 *//////////////////////////////////////////////////////////////////////////////////

umgebung = function() {

	var umgebung = this;

	var triggerHoehe = 3;
	erstelleFahrbahn();

	stassenElementURL = "assets/models/strassenelement_b02.js";

	for ( i = 0; i < strassenElementAnzahl; i++) {
		erstelleUmgebungsElement(i);
	}

	/* Funktion zum erstellen eines neuen Umgebungsabschnitts*/
	function erstelleUmgebungsElement(i) {
		erstelleStatischeUmgebung(i);
		erstelleTriggerAussen();
		for ( spurNummer = 0; spurNummer < 3; spurNummer++) {
			erstelleTriggerInnen(spurNummer);
		}
		//strassenElementZahl++;
	};

	function erstelleStatischeUmgebung(i) {
		var statischeUmgebungsgruppe = new THREE.Object3D();
		// strassenelement
		laneAssist.loader.load(stassenElementURL, function(geometrie, mat) {
			
			// Seitenstreifen
			mat[0]= pGreyReflectiveT;
			// Leitplanke
			mat[1]= pChromeT;
			// Fahrbahn
			mat[2]= pWhiteT;
			// 
			mat[3]= pRedT;
			
			var strassenElementMaterialien = new THREE.MeshFaceMaterial(mat);

			var strassenElement = new THREE.Mesh(geometrie, strassenElementMaterialien);
			var strassenElement2 = new THREE.Mesh(geometrie, strassenElementMaterialien);
			strassenElement.position.z -= 100;
			strassenElement2.position.z -= 100;
			strassenElement.position.y += 1.5;
			strassenElement2.position.y += 1.5;
			strassenElement.position.x = -200 + i * 400;
			strassenElement2.position.x = i * 400;
			strassenElement.receiveShadow = true;
			strassenElement2.receiveShadow = true;
			strassenElement.castShadow = true;
			strassenElement2.castShadow = true;
			statischeUmgebungsgruppe.add(strassenElement);
			statischeUmgebungsgruppe.add(strassenElement2);
		}, 'assets/models');

		szene.add(statischeUmgebungsgruppe);

		queueStatischeUmgebung.push(statischeUmgebungsgruppe);
	}

	function erstelleFahrbahn() {

		// Physijs-Material fuer Strasse
		var ground_grey = Physijs.createMaterial(pRedT, 1, .7);

		var fahrbahnGeometrie = new THREE.PlaneGeometry(1, 1, 1,1);
		// Physikalischer Untergrund (wegen Reibung) ohne Masse (um ihn in der Welt zu fixieren)
		var fahrbahn = new Physijs.PlaneMesh(fahrbahnGeometrie, ground_grey,0);

		fahrbahn.__dirtyRotation = true;
		fahrbahn.__dirtyPosition = true;
		fahrbahn.rotation.x = -Math.PI / 2;
		fahrbahn.castShadow = false;
		fahrbahn.receiveShadow = false;

		// Positionierung entsprechend vorangegangener Elemente
		fahrbahn.position.x = -300;
		// Mit vorliegenden Daten abstimmen
		fahrbahn.position.z = 0;
		fahrbahn.position.y = 1.5;

		// Zur szene hinzufuegen
		szene.add(fahrbahn);
		// Fahrbahn-Array aktualisieren
		queueFahrbahn.push(fahrbahn);
	}

	function erstelleTriggerAussen() {
		//
		var triggerAussenLinks = new Physijs.BoxMesh(new THREE.CubeGeometry(399, 2, 6, 20, 1, 1), lTransparentT, 0);
		var triggerAussenRechts = new Physijs.BoxMesh(new THREE.CubeGeometry(399, 2, 6, 20, 1, 1), lTransparentT, 0);

		triggerAussenLinks.trigger = "AussenLinks";
		triggerAussenRechts.trigger = "AussenRechts";

		// triggerAussenLinks._physijs.collision_flags = 4;
		// triggerAussenRechts._physijs.collision_flags = 4;

		// Positionieren der Trigger anhand der Fahrbahnbreite und Schattenempfang aktivieren
		triggerAussenLinks.position.x = -200 + queueTriggerAussenRechts.length * 400;
		triggerAussenLinks.position.y = triggerHoehe;
		triggerAussenLinks.position.z = -27;
		triggerAussenLinks.__dirtyPosition = true;
		triggerAussenLinks.__dirtyRotation = true;
		triggerAussenLinks.receiveShadow = true;

		// Positionieren der Trigger anhand der Fahrbahnbreite und Schattenempfang aktivieren
		triggerAussenRechts.position.x = -200 + queueTriggerAussenRechts.length * 400;
		triggerAussenRechts.position.y = triggerHoehe;
		triggerAussenRechts.position.z = 42;
		triggerAussenRechts.__dirtyPosition = true;
		triggerAussenRechts.__dirtyRotation = true;
		triggerAussenRechts.receiveShadow = true;

		// Eventlistener an Trigger binden
		triggerAussenLinks.addEventListener('collision', function(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal) {
			kollisionsBehandlungInnenTest(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal);
			// var temp = triggerAussenLinks;
			// szene.remove(triggerAussenLinks);
			// szene.add(temp);
			if (contact_normal.z == 1.00 || contact_normal.z == -1.00) {
				kollisionsBehandlungInnenTest(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal);
			} else {
				// console.log("triggerAussenLinks");
			}
		});

		// Eventlistener an Trigger binden
		triggerAussenRechts.addEventListener('collision', function(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal) {
			kollisionsBehandlungInnenTest(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal);
			if (contact_normal.z == 1.00 || contact_normal.z == -1.00) {
				kollisionsBehandlungInnenTest(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal);
			} else {
				//console.log("triggerAussenRechts");
			}
		});

		// Hinzufuegen der Trigger zur szene
		szene.add(triggerAussenLinks);
		szene.add(triggerAussenRechts);
		queueTriggerAussenLinks.push(triggerAussenLinks);
		queueTriggerAussenRechts.push(triggerAussenRechts);
	}

	function erstelleTriggerInnen(spurNummer) {
		var triggerLinks = new Physijs.BoxMesh(new THREE.CubeGeometry(399, 2, 3, 1, 1, 1), lTransparentT, 0);
		var triggerMitte = new Physijs.BoxMesh(new THREE.CubeGeometry(399, 2, 5, 1, 1, 1), lTransparentT, 0);
		var triggerRechts = new Physijs.BoxMesh(new THREE.CubeGeometry(399, 2, 3, 1, 1, 1), lTransparentT, 0);

		triggerLinks.trigger = "Seite";
		triggerMitte.trigger = "Mitte";
		triggerRechts.trigger = "Seite";

		triggerLinks._physijs.collision_flags = 4;
		triggerMitte._physijs.collision_flags = 4;
		triggerRechts._physijs.collision_flags = 4;

		triggerLinks.position.x = -200 + queueTriggerAussenRechts.length * 400;
		triggerLinks.position.y = triggerHoehe;
		triggerLinks.position.z = -22 + spurNummer * 20;
		triggerLinks.__dirtyPosition = true;
		triggerLinks.__dirtyRotation = true;

		triggerMitte.position.x = -200 + queueTriggerAussenRechts.length * 400;
		triggerMitte.position.y = triggerHoehe;
		triggerMitte.position.z = -13 + spurNummer * 20;
		triggerMitte.__dirtyPosition = true;
		triggerMitte.__dirtyRotation = true;

		triggerRechts.position.x = -200 + queueTriggerAussenRechts.length * 400;
		triggerRechts.position.y = triggerHoehe;
		triggerRechts.position.z = -5 + spurNummer * 20;
		triggerRechts.__dirtyPosition = true;
		triggerRechts.__dirtyRotation = true;

		// Eventlistener an Trigger binden
		triggerLinks.addEventListener('collision', function(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal) {
			if (contact_normal.z == 1.00 || contact_normal.z == -1.00) {
				kollisionsBehandlungInnenTest(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal);
			} else {
				// console.log("triggerMitteLinks");
			}
		});

		// Eventlistener an Trigger binden
		triggerMitte.addEventListener('collision', function(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal) {
			//console.log("Mitte")
		});
		
		// Eventlistener an Trigger binden
		triggerRechts.addEventListener('collision', function(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal) {
			if (contact_normal.z == 1.00 || contact_normal.z == -1.00) {
				kollisionsBehandlungInnenTest(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal);
			} else {
				// console.log("triggerMitteMitte");
			}
		});

		szene.add(triggerLinks);
		szene.add(triggerMitte);
		szene.add(triggerRechts);

		queueTriggerLinks.push(triggerLinks);
		queueTriggerMitte.push(triggerMitte);
		queueTriggerRechts.push(triggerRechts);
	}

	function kollisionsBehandlungAussen(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal) {
	}

	function kollisionsBehandlungInnenTest(kollisionsObjekt, kollisionsWucht, relative_rotation, contact_normal) {
		if (laneAssistMindestGeschwindigkeit && !spurwechsel) {
			if (kollisionsObjekt.radNummer == 2 || kollisionsObjekt.radNummer == 3) {
				if (contact_normal.z < 0 && !laneAssist.laneAssistAktiv) {
					if (blinker_rechts) {
						console.log("Spurwechsel nach rechts");
					} else {
						//console.log("Hier greift Active Lane Assist: nach links einlenken");
						laneAssist.laneAssistAktiv = true;
						nachLinksLenken(0);
					}
				}
				if (contact_normal.z > 0 && !laneAssist.laneAssistAktiv) {
					if (blinker_links) {
						console.log("Spurwechsel nach links");
					} else {
						//console.log("Hier greift Active Lane Assist: nach rechts einlenken");
						laneAssist.laneAssistAktiv = true;
						nachRechtsLenken(0);
					}
				}
			}
		}
	}

	function zufallszahl(min, max) {
		return (Math.random() * (max - min)) + min;
	}

};
